import os
import re
import datetime
from functools import reduce

from pathlib import Path
import pandas as pd
from pandas import DataFrame, Series
from datetime import datetime
from pathlib import Path

from common import utils

import logging

logging.basicConfig(
    level=logging.DEBUG,
    # 格式说明：
    # %(levelname)8s → 右对齐，总宽度8个字符
    format='%(levelname)8s: %(message)s'
)

# 中文字符宽度调整
pd.set_option('display.unicode.east_asian_width', True)
# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置value的显示长度为100，默认为50
pd.set_option('max_colwidth', 100)





def calculate_date_scores(se_date: Series, base_score=25) -> Series:
    """
    计算日期数组中每个日期的评分
    """

    # 1. 找到最早日期
    min_date = se_date.min()

    # 2. 计算每个日期与最早日期的天数差
    days_diff = (se_date - min_date).dt.days

    return base_score - (days_diff + 1) // 2


def merge_student_dataframes(*dfs):
    """
    合并多个包含学生数据的DataFrame

    参数:
    *dfs : 可变数量的DataFrame，每个DataFrame必须包含'学号'和'姓名'列

    返回:
    pd.DataFrame : 合并后的DataFrame，包含学号、姓名和所有科目列

    异常:
    ValueError: 如果输入少于两个DataFrame
    """
    if len(dfs) < 2:
        raise ValueError("至少需要两个DataFrame进行合并")

    # 1. 提取所有DataFrame中的科目列（排除学号和姓名）
    all_subject_columns = set()
    for df in dfs[1:]:  # 从第二个DataFrame开始
        subject_cols = [col for col in df.columns if col not in ['学号', '姓名']]
        all_subject_columns.update(subject_cols)

    # 2. 创建基础表（只保留学号和姓名）
    base_df = dfs[0][['学号', '姓名']].copy()

    # 3. 使用reduce函数逐步合并所有DataFrame
    def merge_func(left, right):
        # 从右侧DataFrame中提取学号和科目列
        right_subject_cols = [col for col in right.columns if col in all_subject_columns]
        right_subset = right[['学号'] + right_subject_cols]
        right_subset['学号'].astype(int)

        # 左连接合并
        return pd.merge(left, right_subset, on='学号', how='left')

    # 应用reduce进行逐步合并
    merged_df = reduce(merge_func, [base_df] + list(dfs[1:]))

    return merged_df


if __name__ == "__main__":
    se_files_name = get_报告_files_name(f"{BASE_PATH_企业级应用课设}\提交\报告")
    print(se_files_name)
